import 'package:get/get.dart';
import '../../../utils/storage/cartService.dart';
import '../../../utils/storage/userService.dart';
import '../../../utils/storage/storage.dart';

class CartController extends GetxController {
  //TODO: Implement CartController
  RxList cartList = [].obs; // 从本地缓存读取到的购物车列表（在添加时先存入本地）
  RxBool isAllChecked = false.obs; // 是否全选
  RxInt checkedGoodsCount = 0.obs; // 选中的商品数量
  RxBool isEdit = false.obs; // 是否处于编辑状态

  // 改变编辑状态
  void changeEditStatus() {
    isEdit.value = !isEdit.value;
    update();
  }

  // 删除选中商品
  void deleteCheckedGoods() async {
    bool allNotChecked = cartList.every( (item) => !item["checked"]); // 一个都没选中
    if(allNotChecked){
      Get.snackbar("提示", "请先选择需要删除商品");
      return;
    }
    List tempList = [];
    for (int i = 0; i < cartList.length; i++) {
      // if (cartList[i]["checked"] == true) {
      //   cartList.remove(cartList[i]); // 不能直接删除，每次删除后长度会有变化
      // }
      if (cartList[i]["checked"] == false) {
        // 未选中的商品，保留在购物车列表中
        tempList.add(cartList[i]);
      }
    }
    cartList.value = tempList;
    await CartService.setCartData(tempList);
    update();
  }

  // 获取购物车列表
  void getCartList() async {
    cartList.value = await CartService.getCartData();
    // 判断是否全选
    isAllChecked.value = cartList.every((item) => item["checked"] == true);
    calcCheckedCount();
    update();
  }

  // 增加数量
  void incrementCount(Map cartItem) {
    List tempList = [];
    for (int i = 0; i < cartList.length; i++) {
      if (cartList[i]["_id"] == cartItem["_id"] &&
          cartList[i]["selectedAttr"] == cartItem["selectedAttr"]) {
        // 修改指定商品的数量
        cartList[i]["count"]++; //直接修改响应式数组里面的属性值，无法触发响应式更新
      }
      tempList.add(cartList[i]);
    }
    cartList.value = tempList; // 赋值给响应式数组，触发视图更新
    update();
    CartService.setCartData(tempList); // 更新本地缓存
  }

  // 减少数量
  void decrementCount(Map cartItem) {
    List tempList = [];
    for (int i = 0; i < cartList.length; i++) {
      if (cartList[i]["_id"] == cartItem["_id"] &&
          cartList[i]["selectedAttr"] == cartItem["selectedAttr"]) {
        // 修改指定商品的数量
        if (cartList[i]["count"] > 1) {
          cartList[i]["count"]--; //直接修改响应式数组里面的属性值，无法触发响应式更新
        } else {
          Get.snackbar('提示', "数量不能小于1");
        }
      }
      tempList.add(cartList[i]);
    }
    cartList.value = tempList; // 赋值给响应式数组，触发视图更新
    update();
    CartService.setCartData(tempList); // 更新本地缓存
  }

  // 选择商品(复选框)
  void checkedGoods(Map cartItem) {
    List tempList = [];
    for (int i = 0; i < cartList.length; i++) {
      if (cartList[i]["_id"] == cartItem["_id"] &&
          cartList[i]["selectedAttr"] == cartItem["selectedAttr"]) {
        cartList[i]["checked"] = !cartList[i]["checked"]; // 取反
      }
      tempList.add(cartList[i]);
    }
    cartList.value = tempList; // 赋值给响应式数组，触发视图更新
    // 判断是否全选
    isAllChecked.value = cartList.every((item) => item["checked"] == true);
    calcCheckedCount(); // 计算已选商品数量
    update();
    CartService.setCartData(tempList); // 更新本地缓存
  }

  // 点击全选
  void checkedAllGoods(bool checkeStatus) {
    List tempList = [];
    for (int i = 0; i < cartList.length; i++) {
      cartList[i]["checked"] = checkeStatus;
      tempList.add(cartList[i]);
    }
    cartList.value = tempList; // 赋值给响应式数组，触发视图更新
    isAllChecked.value = checkeStatus;
    calcCheckedCount();
    update();
    CartService.setCartData(tempList); // 更新本地缓存
  }

  // 结算的数量
  List checkedGoodsList() {
    List tempList = [];
    for (int i = 0; i < cartList.length; i++) {
      if (cartList[i]["checked"] == true) {
        tempList.add(cartList[i]);
      }
    }
    return tempList;
  }

  // 计算结算数量
  void calcCheckedCount() {
    int count = 0;
    for (int i = 0; i < cartList.length; i++) {
      if (cartList[i]["checked"] == true) {
        count += cartList[i]["count"] as int;
      }
    }
    checkedGoodsCount.value = count;
  }

  // 去结算
  void checkout() async {
    bool loginStatus = await UserService.getUserLoginState();
    if (loginStatus == false) {
      Get.toNamed("/code-login-step-one");
      Get.snackbar("提示", "请先登录");
      return;
    }
    List checkedList = checkedGoodsList(); // 获取选中的商品列表
    if (checkedList.isEmpty) {
      Get.snackbar("提示", "请选择商品");
      return;
    }
    // 缓存跳转
    await Storage.setData("checkoutList", checkedList);
    // 跳转
    Get.toNamed("/checkout");
  }

  @override
  void onInit() {
    super.onInit();
    // getCartList();

    print("cart controller init");
  }

  @override
  void onClose() {
    super.onClose();
  }
}
